package com.example.demo.config.mybatis;

import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by Mojo on 2017/8/30.
 */
//@Configuration
////TODO 注意，由于MapperScannerConfigurer执行的比较早，所以必须有下面的注解
//@AutoConfigureAfter(MyBatisConfig.class)
public class MyBatisMapperScannerConfig {

	/**
	 * 其实MyBatisMapperScannerConfig 是一个MyBatis扫描Mapper接口扫描。
	 *
	 * MapperScannerConfigurer根据指定的创建接口或注解创建映射器。我们这里映射了com.example.demo.dao包下的接口。
	 *
	 * 使用MapperScannerConfigurer，没有必要去指定SqlSessionFactory或SqlSessionTemplate，
	 * 因为MapperScannerConfigurer将会创建MapperFactoryBean，之后自动装配。
	 * 但是，如果你使用了一个以上的DataSource(因此，也是多个的SqlSessionFactory),那么自动装配可能会失效。
	 * 这种情况下，你可以使用sqlSessionFactory或sqlSessionTemplate属性来设置正确的工厂/模板。
	 *
	 * 注意的是网络上有些文章中在MapperScannerConfigurer之前还配置了 MyBatisConfig，
	 * 因为MapperScannerConfigurer会创建MapperFactoryBean，所以我的项目中没有再配置MyBatisConfig。
	 * 经使用没有出现任何问题。
	 */
	@Bean
	public MapperScannerConfigurer mapperScannerConfigurer() {
		MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
		mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
		mapperScannerConfigurer.setBasePackage("com.example.demo.dao");
		return mapperScannerConfigurer;
	}

}
